﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using BU;

namespace PlattegrondImport
{
    public partial class ImportGUI : Form
    {
        /// <summary>
        /// Dit array bevat alle panels, behalve panel 8
        /// </summary>
        Panel[] panelArray;
        /// <summary>
        /// Hierin wordt de huidige panel index bijgehouden
        /// </summary>
        int panelIndex = 0;
        /// <summary>
        /// Hier wordt het zoompercentage van panel 8 bijgehouden
        /// </summary>
        double zoompercentage;
        /// <summary>
        /// Het aantal punten van het rek wordt hierin bijgehouden
        /// </summary>
        private int rekcount;
        /// <summary>
        /// Het aantal punten van een muur wordt hierin bijgehouden
        /// </summary>
        private int muurcount;
        Image img1;
        private UpperLayer layer;

        /// <summary>
        /// Rekent om waar er daadwerkelijk op de afbeelding heen wordt gewezen
        /// </summary>
        /// <param name="plaats">De om te rekenen plaats</param>
        /// <returns></returns>
        private Point RelatiefNaarDaadwerkelijk(Point plaats)
        {
            plaats.Y = (int)(plaats.Y / zoompercentage * 100);
            plaats.X = (int)(plaats.X / zoompercentage * 100);
            return plaats;
        }

        /// <summary>
        /// De winkel die gemaakt wordt
        /// </summary>
        private BUWinkel store;

        private List<Point> selected;

        public ImportGUI()
        {
            InitializeComponent();
            selected = new List<Point>();
            panelArray = new Panel[]{panel1, panel2,panel3, panel4, panel5, panel6, panel7};
            rekcount = -1;
        }

        private void buttonBack_Click(object sender, EventArgs e)
        {
            buttonNext.Enabled = true;
            panelIndex--;
            if (panelIndex <= 0)
            {
                buttonBack.Enabled = false;
                buttonNext.Enabled = true;
            }

            panelArray[panelIndex].Visible = true;
            panelArray[panelIndex].BringToFront();
        }

        private void buttonNext_Click(object sender, EventArgs e)
        {
            buttonBack.Enabled = true;

            panelIndex++;
            if (panelIndex == panelArray.Length - 1)
            {
                buttonNext.Enabled = false;
                buttonBack.Enabled = true;
            }
            panelArray[panelIndex].Visible = true;
            panelArray[panelIndex].BringToFront();
        }

        private void Form_Sluiten(object sender, EventArgs e)
        {
            if (MessageBox.Show("Weet u zeker dat u de wizard wilt afsluiten?", "Afsluiten", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                this.Close();            
        }

        private void buttonPlattegrondInladen_Click(object sender, EventArgs e)
        {
            rekcount = 0;
            OpenFileDialog ofd1 = new OpenFileDialog();
            ofd1.Title = "Selecteer een afbeelding";
            ofd1.InitialDirectory = "c:\\";
            ofd1.Filter = "Afbeeldingen ( *.jpg *.jpeg *.gif *.png)| *.jpg; *.jpeg *.gif *.png";
            if (ofd1.ShowDialog() == DialogResult.OK)
            {
                layer = new UpperLayer(Image.FromFile(ofd1.FileName.ToString()));
                pictureBoxPlattegrond.Image = layer.Original;
                PlattegrondTonen(layer.Original);
                zoompercentage = 100;
                store = BUWinkel.GetInstance(layer.Original);
                img1 = Image.FromFile(ofd1.FileName.ToString());
            }
        }

        /// <summary>
        /// Zoomt in met de algemene zoomfactor
        /// </summary>
        private void Zoom()
        {
            if (layer != null)
            {
                Size formaat = new Size((int)((zoompercentage / 100) * layer.Original.Width), (int)((zoompercentage / 100) * layer.Original.Height));
                Bitmap zoombmp = new Bitmap(layer.Original, formaat);
                int hPercentage = hScrollBar1.Maximum;
                int vPercentage = vScrollBar1.Maximum;
                PlattegrondTonen(zoombmp);
                vScrollBar1.Value = (vScrollBar1.Value * vScrollBar1.Maximum) / vPercentage;
                hScrollBar1.Value = (hScrollBar1.Value * hScrollBar1.Maximum) / hPercentage;
                schuiven(-vScrollBar1.Value, -hScrollBar1.Value);
            }
        }

        private void ImportGUI_FormClosing(object sender, FormClosingEventArgs e)
        {
            
        }

        private void btnZoomIn_Click(object sender, EventArgs e)
        {
            zoompercentage += 10;
            Zoom();
        }

        private void btnZoomOut_Click(object sender, EventArgs e)
        {
            if (zoompercentage > 10) { zoompercentage -= 10; }
            Zoom();
        }

        private void ImportGUI_Load(object sender, EventArgs e)
        {

        }

        /// <summary>
        /// Toont de gegeven afbeelding op het plattegrond vlak.
        /// </summary>
        /// <param name="image">De plattergrond</param>
        private void PlattegrondTonen(Image image)
        {
            btnZoomIn.Visible = true;
            btnZoomOut.Visible = true;
            if (panel8.Height <= image.Height)
            {
                vScrollBar1.Maximum = image.Height - panel8.Height;
                vScrollBar1.Visible = true;
            }
            else { vScrollBar1.Visible = false; }
            if (panel8.Width <= image.Width)
            {
                hScrollBar1.Maximum = image.Width - panel8.Width;
                hScrollBar1.Visible = true;
            }
            else { hScrollBar1.Visible = false; }
            pictureBox8.Image = image;
        }

        private void vScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            schuiven((-vScrollBar1.Value), pictureBox8.Left);
        }

        private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            schuiven(pictureBox8.Top, (-hScrollBar1.Value));
        }

        /// <summary>
        /// Regelt het verschuiven van de plattegrond
        /// </summary>
        /// <param name="Top">Hoeveel er vanuit de top verschoven moet worden</param>
        /// <param name="Left">Hoeveel er vanuit de linker zijde verschoven moet worden</param>
        private void schuiven(int Top, int Left)
        {
            pictureBox8.Top = Top;
            pictureBox8.Left = Left;
        }


        private void panel8_Click(object sender, EventArgs e)
        {
            
        }

        private void btnBevestig_Click(object sender, EventArgs e)
        {
            layer.render();
            PlattegrondTonen(layer.Original);
        }

        private void pictureBox8_MouseMove(object sender, MouseEventArgs e)
        {
            Point plaats = RelatiefNaarDaadwerkelijk(new Point((e as MouseEventArgs).X, (e as MouseEventArgs).Y));
            if (store.aantalRekken > 0)
            {
                Point[] rek = store.InRek(plaats);
                Bitmap afbeelding = (Bitmap) pictureBox8.Image;
                Graphics temp = Graphics.FromImage(afbeelding);
                SolidBrush brusch = new SolidBrush(Color.FromArgb(25, Color.Blue));
                temp.FillPolygon(brusch, rek);
                temp.DrawImage(afbeelding, 0, 0);

                pictureBox8.Refresh();
            }
        }

        private void pictureBox8_Click(object sender, EventArgs e)
        {
            Point plaats = new Point((e as MouseEventArgs).X, (e as MouseEventArgs).Y);
            plaats = RelatiefNaarDaadwerkelijk(plaats);
            if (rBRekken.Checked)
            {
                rekcount++;
                switch (rekcount)
                {
                    case (1):
                        layer.Punten.Add((plaats));
                        break;
                    case (2):
                        layer.Punten.Add((plaats));
                        break;
                    case (3):
                        layer.Punten.Add((plaats));
                        break;
                    case (4):
                        layer.Punten.Add((plaats));
                        store = BUWinkel.GetInstance();
                        Point[] punten = new Point[4];
                        for (int i = 0; i < 4; i++)
                        {
                            Point temp = layer.Punten[i];
                            punten[i] = temp;
                        }
                        store.VoegRekToe(punten);
                        rekcount = 0;
                        break;
                    default:
                        break;
                }
            }
            else { rekcount = 0; }
            if (rBMuren.Checked)
            {
                switch (muurcount)
                {
                    case (0):
                        layer.Punten.Add((plaats));
                        muurcount++;
                        break;
                    case (1):
                        layer.Punten.Add((plaats));
                        muurcount++;
                        break;
                    case (2):
                        layer.Punten.Add((plaats));
                        muurcount++;
                        break;
                    case (3):
                        layer.Punten.Add((plaats));
                        muurcount = 0;
                        break;
                    default:
                        
                        break;
                }
            }
            else { muurcount = 0; }
            if (rBSchappen.Checked)
            {

            }
            PlattegrondTonen(pictureBox8.Image);
        }

        private void buttonNieuwProduct_Click(object sender, EventArgs e)
        {
            ImporteerArtikel importeerArtikel = new ImporteerArtikel();
            importeerArtikel.ShowDialog();
        }

        private void buttonVerwijderProduct_Click(object sender, EventArgs e)
        {
            VerwijderArtikel verwijderArtikel = new VerwijderArtikel();
            verwijderArtikel.ShowDialog();
        }

        /// <summary>
        /// Button voor opslaan plattegrond
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnOpslaan_Click(object sender, EventArgs e)
        {
            BUArtikel A1 = new BUArtikel();
            A1.Naam = "Condooms voor Paul";
            A1.Categorie = "Paul's sokkenla";

            BUArtikel A2 = new BUArtikel();
            A2.Naam = "Dildo's voor Kevin";
            A2.Categorie = "Paul's sokkenla";

            BUArtikel A3 = new BUArtikel();
            A3.Naam = "Robert's buttplug";
            A3.Categorie = "Kevin's kont";

            BUWinkelwagen ww1 = new BUWinkelwagen();
            ww1.Artikelen = new List<BUArtikel>();
            ww1.Artikelen.Add(A3);
            ww1.Volume = 600;

            BUWinkel winkel1 = BUWinkel.GetInstance();
            winkel1.Plattegrond = img1;

            

            ObjectToSerialize ost = new ObjectToSerialize();
            ost.BUObjecten = new List<object>();
            ost.BUObjecten.Add(A1);
            ost.BUObjecten.Add(A2);
            ost.BUObjecten.Add(A3);
            ost.BUObjecten.Add(ww1);
            ost.BUObjecten.Add(winkel1);

            SaveFileDialog sfd = new SaveFileDialog();
            sfd.Title = "Opslaan";
            sfd.Filter = "PJR bestand|*.pjr";
            sfd.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            string pad = "";

            if (sfd.ShowDialog() == DialogResult.OK)
            {
                pad = sfd.FileName;
            }

            Serializer serializer = new Serializer();
            serializer.SerializeObject(sfd.FileName, ost);
        }

        /// <summary>
        /// Button voor laden plattegrond
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnLaden_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Title = "Open plattegrond";
            ofd.Filter = "PJR bestand|*.pjr";
            ofd.InitialDirectory = System.Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            string pad = "";

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                pad = ofd.FileName;
            }

            Serializer serializer = new Serializer();
            ObjectToSerialize ost = serializer.DeSerializeObject(pad);
            List<object> BUobjecten = new List<object>();
            BUobjecten.Clear();
            BUobjecten = ost.BUObjecten;

            for (int i = 0; i < BUobjecten.Count; i++)
            {
                if (BUobjecten[i].GetType() == typeof(BUWinkel)) 
                {
                    BUWinkel b = (BUWinkel)BUobjecten[i];
                    pbSerialize.Image = b.Plattegrond;
                }
            }
        }
    }

    public class UpperLayer
    {
        private Image original;
        public Image Original
        {
            get { return original; }
            set { original = value; }
        }

        private Image layer;
        public Image Layer
        {
            get { return layer; }
            set { layer = value; }
        }

        public UpperLayer(Image Original)
        {
            this.punten = new List<Point>();
            this.original = Original;
        }

        /// <summary>
        /// Houden de geklikte punten bij
        /// </summary>
        private List<Point> punten;

        public List<Point> Punten
        {
            get { return punten; }
            set { punten = value; }
        }



        public void render()
        {
            //int verhoudingBuiten = 20;
            //int verhoudingBinnen = 10;
            //Graphics g = Graphics.FromImage(original);
            //SolidBrush outside = new SolidBrush(Color.Black);
            //SolidBrush inside = new SolidBrush(Color.White);
            //for (int i = 0; i < punten.Count; i++)
            //{
            //    g.FillRectangle(outside, (verhoudingBuiten / 2) * punten[i].Punt.X, (verhoudingBuiten / 2) * punten[i].Punt.Y, verhoudingBuiten, verhoudingBuiten);
            //    g.FillRectangle(inside, (verhoudingBinnen / 2) * punten[i].Punt.X, (verhoudingBinnen / 2) * punten[i].Punt.Y, verhoudingBuiten/2, verhoudingBuiten/2);
            //}
            //g.DrawImage(original, 0, 0);
        }
    }

    public class selectedblok
    {
        private Point punt;

        public Point Punt
        {
            get { return punt; }
            set { punt = value; }
        }
        
        public selectedblok(Point plaats)
        {
            punt = plaats;
        }

    }
}